package edu.scsw.tech.unit2;

import java.util.Scanner;

// 计算两个整数的最大公约数和最小公倍数
public class GCDAndLCM {

    public static void main(String[] args) {
        // 创建Scanner对象，用于读取用户输入
        Scanner sc = new Scanner(System.in);

        // 提示用户输入第一个数，并读取该数
        System.out.print("请输入第一个数: ");
        int m = sc.nextInt();

        // 提示用户输入第二个数，并读取该数
        System.out.print("请输入第二个数: ");
        int n = sc.nextInt();

        // 计算并显示最大公约数
        int gcd = calculateGCD1(m, n);
        System.out.println("最大公约数是: " + gcd);

        // 计算并显示最小公倍数
        int lcm = calculateLCM(m, n, gcd);
        System.out.println("最小公倍数是: " + lcm);

        // 关闭Scanner对象，释放资源
        sc.close();
    }

    /**
     * 使用欧几里得算法计算两个整数的最大公约数（GCD）
     *
     * @param a 第一个整数
     * @param b 第二个整数
     * @return 最大公约数
     */
    public static int calculateGCD1(int a, int b) {
        // 使用while循环，直到b为0
        while (b != 0) {
            int temp = b; // 临时变量保存b的值
            b = a % b; // 计算a对b的余数，并赋值给b
            a = temp; // 将原b的值赋值给a
        }
        return a; // 返回a，即最大公约数
    }

    /**
     * 计算两个整数的最小公倍数（LCM）
     *
     * @param a   第一个整数
     * @param b   第二个整数
     * @param gcd 两个整数的最大公约数
     * @return 最小公倍数
     */
    public static int calculateLCM(int a, int b, int gcd) {
        return Math.abs(a * b) / gcd; // 使用公式计算最小公倍数
    }

    /**
     * 使用暴力法计算两个整数的最大公约数（GCD）
     *
     * @param a 第一个整数
     * @param b 第二个整数
     * @return 最大公约数
     */
    public static int calculateGCD(int a, int b) {
        // 选择较小的数作为循环的起点
        int r = a > b ? b : a;
        // 从较小的数向1循环，找到第一个能被两个数整除的数
        for (int i = r; i > 0; i--) {
            if (a % i == 0 && b % i == 0) {
                return i; // 返回最大公约数
            }
        }
        return 1; // 如果没有其他公约数，返回1
    }
}
